# Author: Sanmu
# CreatTime: 2024/10/19
# Descriptior:接口实现
"""
    新bug：如果单个body中需要传入多个关联数据该如何处理和解析？
    代码优化：
        1、所有的数据处理，包括headers和body，都在固定的单元格位置
        2、数据处理的逻辑是相同的
        3、对于单个请求下参数有多个需要管理的数据该如何循环解析所有需要解析的数据
        4、辅助增加用例执行记录，包括日志，包括数量统计等
"""
import ast
import json

import openpyxl
from api_keys.api_keys import ApiKeys
from conf import excel_style
from conf.log_conf import get_logger
from conf.set_conf import write_conf, read_conf

succeed = 0
failed = 0
log = get_logger()
failed_list = []
sheet_name = None
def text_replace(data):
    values = data.split('${',1)[1].split('}',1)[0]
    return data.replace('${'+f'{values}'+'}',json.dumps(read_conf('params',values)))
def run(file):
    excel = openpyxl.load_workbook(file)
    api = ApiKeys('TEST_ENV')
    global succeed,failed,sheet_name
    try:
        for name in excel.sheetnames:
            sheet = excel[name]
            sheet_name = name
            log.info('开始执行测试用例：' + name)
            for value in sheet.values:
                if type(value[0]) is int:
                    log.info('正在操作：' + value[1])
                    value = [i for i in value]
                    if value[4]:
                        if '${' in value[4]:
                            value[4] = text_replace(value[4])
                        value[4] = json.loads(value[4]) #字符串转字典
                    if value[5]:
                        if '${' in value[5]:
                            value[5] = text_replace(value[5])
                        value[5] = json.loads(value[5])
                        # value[5] = ast.literal_eval(value[5])
                    if value[2]:
                        if value[3] == 'get':
                            res = api.do_get(path=value[2],headers=value[4],params=value[5])
                            print(value[5])
                            print(res.json())
                        if value[3] == 'post':
                            res = api.do_post(path=value[2],json=value[5],headers=value[4])
                            print(type(value[5]))
                            print(value[5])
                            print(res.json())
                    if value[6]:
                        write_conf('params',value[6],api.get_text(res.json(),value[6]))

                    if value[7]:
                        expected = json.loads(value[7])
                        for k, v in expected.items():
                            status = api.assert_text(expected=expected[k],res =res.json(), key=k)
                            # 通过断言方法生成一个结果，基于结果来判断流程的结果是成功还是失败
                            if status:
                                excel_style.pass_(sheet.cell(row=value[0] + 1, column=9))
                                succeed += 1
                            else:
                                excel_style.failed(sheet.cell(row=value[0] + 1, column=9))
                                failed +=1
                                failed_list.append(res.json())
                            excel.save(file)
    except:
        log.error('程序报错，请查看具体报错信息！')
        failed += 1
        failed_list.append(file + '：' + sheet_name)
    finally:
        excel.close()
def sum_info():
    log.warning(f'''
    成功用例条数：{succeed},
    失败用例条数：{failed},
    失败用例具体信息：{failed_list}
    ''')